<?php

$this->useClass("Handler_Community");
class Action_Community_ShowCommunityPrefs extends Handler_Community
{
	var $ui_msg = array(
		'create_community_success' => 'Настройки сохранены',
		'edit_community_success' => 'Настройки сохранены',
		'access_denied' => 'Доступ запрещён',
		);

	public function getUrl ()
	{
		return $this->ctx->rh->base_url.$this->acl_data['community_url'].'/edit';
	} // end of function getUrl

	public function getWidgetsConfig ()
	{
		//		$community_oid = $this->acl_data['comity_oid'];
		$widgets = array(
			0 => array (
				'name' => 'CommunityRightsWidget',
				'params' => array(
					'widget_position' => 'widgets',
					'widget_view' => 'WG_CommunityRights',
				),
			),
			/*
			1 => array (
				'name' => 'CommunityTdiEditWidget',
				'params' => array(
					//					'community_oid' => $community_oid,
					'widget_position' => 'widgets',
					'widget_view' => 'WG_TdiList',
				),
			),
			*/
		);
		return $widgets;
	} // end of function getWidgetsConfig

	public function init()
	{
		$this->rh->UseClass('RL_CyrDate');

		// -- old theme HACK : 2008-05-21 : lucky -- {{{
		$community_skin = 'platonica';
		$tpl = $this->ctx->tpl;
		$community_model = $this->ctx->mm->getModel("Community");
		$community_model->setDefaultSkin($community_skin);
		$tpl->setSkin($community_skin);
		$views_php = $tpl->findFile('', 'views', $tpl->_skin, 'php');
		unset ($config);
		include $views_php; // got $config
		$this->ctx->rh->views->setViewConfig($config);
		// -- old theme HACK : 2008-05-21 : lucky -- }}}

		parent::init();
	}

	protected function shutdown()
	{
		$this->ctx->db->end();
	}

	public function process ()
	{
		if ($this->ctx->rh->POST || $this->ctx->rh->FILES) {
			$this->change($this->ctx->rh->POST, $this->ctx->rh->FILES);
		} else {
			$this->render($this->ctx->rh->GET);
		}
		$this->shutdown();
	} // end of function process

	private function getCommunity($oid) {

		if (!is_numeric($oid)) {
			// default community template
			//
			$community = new stdClass();
			$community->id = NULL;
			$community->data = array();
		} else {
			$community = $this->model->getCommunity($oid);
			if ($community->is_deleted == 1) $community = false;
		}
		return $community;
	}

	public function render ($info)
	{
		$aa = &$this->aa;

		if ( !isset($aa->acl_data['comity_oid']) ) {
			$aa->template_data['is_createcommunity'] = true;
		}

		$community = $this->getCommunity($aa->acl_data['comity_oid']);
		if ($community === false) {
			$view = $this->rh->views->findByName('community_deleted');
			$view->data = $aa->template_data;
			$this->rh->response->setContent( $view );
			$this->shutdown();
			return;
		}

		if ($this->acl_data['role']['oid']!=$this->aa->regfind("registered_oid") &&
			$this->acl_data['role']['oid']!=$this->aa->regfind("moderator_oid") &&
			$this->acl_data['role']['oid']!=$this->aa->regfind("administrator_oid")) {

			$view = $this->rh->views->findByName('accessdnd');
			$view->data = $aa->template_data;
			$this->rh->response->setContent( $view );
			$this->shutdown();
			return;
		}

		$view = $this->rh->views->findByName('preferences');
		$view->data = $aa->template_data;

		$form = $this->generateForms($community);

		$view->data[   '__widgets__'] = $this->widgets;
		$view->data['community_form'] = $form->Handle(false, NULL, NULL, NULL, false);

		$this->rh->response->setContent( $view );
	} // end of function renderCommunityForm

	private function generateForms( $community )
	{
		// создаст объекты форм для каждого раздела и положит в массив $this->forms, на входе массив с разделами
		$this->rh->UseClass("Form_Form");

		$form = new Form( $this->rh,
			array(
				"auto_user_id"  => 0,
				"template_form"	=> "form:Form",
				"template_buttonlist" => "form:Buttons",
				"db_table" => $community->id, // это id формы
			),
			NULL,
			NULL // дефолтные шаблонные переменные, если таковые есть в шаблонах
		);

		$group1 = $form->AddField( NULL,
			array(
				"model"     => "group", // все аспекты укладываем в "group"
				"interface" => "group",
				"validator" => "group",
				"view"      => "group",

				"group_tpl" => "group:PlainList", // шаблон для вывода группы

				"wrapper"   => "wrapper_group",
				"wrapper_tpl"   => "wrapper:Plain",
			)
		);

		$community_id = 'идентификатор';
		if ( isset($this->aa->acl_data) && isset($this->aa->acl_data['community_url']) ) {
			$community_id = $this->aa->acl_data['community_url'];
		}

		$doctype = array(
			"typename" => "Настройки сообщества",
			"fields" => array(
				"title" => array(
					// параметры бд
					"db_name" => "title",
					"db_type" => "string",
					"db_size" => 255,

					// параметры рендеринга форм, один в один параметры поля для формпроцессора
					"interface_tpl" => "string:Plain", // само поле

					"wrapper_tpl" => "wrapper:TextWrapper", // обертка вокруг поля при создании итема
					"wrapper_title" => "Заголовок сообщества",
					"wrapper_desc" => "Не более 70 символов",

					"validator_params"=> array("not_empty"=>1,),  // пустое-не пустое?
				),
				"community_url" => array(
					"db_name" => "community_url",
					"db_type" => "string",
					"db_size" => 255,

					"interface_tpl" => "string:Plain",

					"wrapper_tpl" => "wrapper:TextWrapper",
					"wrapper_title" => "Уникальный идентификатор сообщества",
					"wrapper_desc" => "Ссылка на сообщество будет такая: " .
					$this->ctx->rh->base_url . $community_id .
					". Максимум 30 символов, только английские буквы, цифры и знак подчеркивания",
					'validator' => 'validator_string',
					"validator_params"=> array(
						"not_empty"=>1,
						"is_regexp" => '/^[a-zA-Z0-9][a-zA-Z0-9_]{0,29}$/',
					),  // пустое-не пустое?
					'validator_func' => array($this, 'validateCommunityUrl'),
				),
				"mod" => array(
					"db_name" => "mod",
					"db_type" => "string",

					'filter' => 'filter_safehtml',

					"interface_tpl" => "string:Tinymce",
					"interface_tpl_params" => array ('tiny_mce_layout' => 'light'),

					"wrapper_tpl" => "wrapper:WysiwygSmallWrapper",
					"wrapper_title" => "Описание сообщества",
					//"wrapper_desc" => "Максимум 100 символов",
					"validator_params"=> array(	"not_empty"=> 1, ),
				),
				"skin" => array(
					"wrapper_tpl" => "wrapper:SelectWrapper", // обертка вокруг поля при создании итема
					"wrapper_title" => "Скин сообщества",
					//"wrapper_desc" => "URL профиля с platonoca_id, максимум 255 символов",

					"view" => "options",
					"interface" => "options",
					"interface_tpl" => "options:Select",

					"options_mode" => "select",

					"options"      => array(
						"platonica" => "platonica",
						"gautama" => "gautama",
						"dkizzle" => "dkizzle",
					),

					"validator_params"=> array(	"not_empty"=>0, ),  // пустое-не пустое?
					'db_default' => 'platonica',
				),
				"logo_image" => array(
					"db_name" => "logo_image_oid",
					"db_type" => "integer",

					"model"      => "model_upload",
					"external_postprocessing" => 1,
					"external_postprocessing_type" => "image",

					"interface_tpl" => "upload:UploadImage",
					"interface_tpl_params" => array ("slot" => 'sm1'),

					"wrapper_tpl"   => "wrapper:FileWrapper",
					"wrapper_title" => "Логотип сообщества",
					"wrapper_desc" => "Только <strong>png</strong>, <strong>gif</strong> или <strong>jpg</strong>",

					"validator" => "validator_upload",
					"validator_params" => array(
						'filetype' => 'image',
						"maxsize" => 2048*1000,
						"fileext" => array('gif', 'png', 'jpg', 'jpe', 'jpeg'),
						/* 'not_empty' => 1 */ ),
				),
				"background_image" => array(
					"db_name" => "background_image_oid",
					"db_type" => "integer",

					"model"   => "model_upload",
					"external_postprocessing" => 1,
					"external_postprocessing_type" => "image",

					"interface_tpl" => "upload:UploadImage",
					"interface_tpl_params" => array ("slot" => 'sm1'),

					"wrapper_tpl"   => "wrapper:FileWrapper",
					"wrapper_title" => "Фон для сообщества",
					"wrapper_desc" => "Только <strong>png</strong>, <strong>gif</strong> или <strong>jpg</strong>",

					"validator" => "validator_upload",
					"validator_params" => array(
						'filetype' => 'image',
						"maxsize" => 2048*1000,
						"fileext" => array('gif', 'png', 'jpg', 'jpe', 'jpeg'),
						/* 'not_empty' => 1 */ ),
				),
			),
		);

		foreach ($doctype['fields'] as $field_name=>$field_config) {
			if (isset($field_config['options_model'])) { // сейчас происходит разбор поля типа options и в нем указана модель, которую нужно использовать для сбора данных
				$this->rh->UseClass( $field_config['options_model'] );
				$model = new $field_config['options_model']( $this->rh, $this->aa );
				$field_config['options'] = $model->$field_config['options_model_method']();
			}

			$store_field_name = isset($field_config['db_name'])? $field_config['db_name'] : $field_name;
			$field_config['model_default'] = isset($community->data[ $store_field_name ]) ? $community->data[ $store_field_name ]: NULL ;

			$group1->model->Model_AddField( $field_name, $field_config );

		}

		$field_text = &$form->AddField( "oid", array(
			"wrapper_tpl"   => "wrapper:Plain", // задаём только враппер
			"model_default" => $community->id,
			"interface_tpl" => "string:Hidden",
			"interface_tpl_params" => array( // дополнительные параметры чисто для html-шаблона
				"id" => "oid",
			),
		) );

		// у каждой формы две кнопки
		$form->AddButton( array(
			"event" => FORM_EVENT_OK,
			"title" => "Okay",
			"template" => "Submit",
		)      );

		$form->AddButton( array(
			"event" => FORM_EVENT_CANCEL,
			"title" => "Cancel",
			"template" => "Cancel",
		)      );

		return $form;
	}

	public function change ($info, $upload)
	{
		// достанем объект, который редактируем
		$community_oid = $this->acl_data['comity_oid'];

		$community = $this->getCommunity($community_oid);
		
		// восстанавим форму редактирования объекта
		$form = $this->generateForms($community);

		if (($content = $form->Handle(false, NULL, NULL, NULL, false)) === false) {
			// мы тут, если форму засабмилили

			// достанем из формы значения атрибутов.
			$field_values = array();
			foreach ($form->hash as $field_name => $field) {
				// HACK : 2007-12-17 : lucky
				// пока не умеем работать с групповыми моделями..

				// 61: может быть это и не хак! форма выводится в группе потому что у меня когда то были заморочки с версткой,
				// так то группа используется чтобы группровать контролы по смыслу
				if ($field->config['model'] !== 'group') {
					$store_field_name = isset($field->config['db_name'])? $field->config['db_name'] : $field_name;
					$field_values[ $store_field_name ] = $form->hash[ $field_name ]->model->model_data;
				}
			}

			// создание нового или редактирование??
			//
			if (empty($community_oid) && empty($field_values['oid'])) {
				// создаем сообщество

				# -- form.onCreateSuccess($field_values)
				$aa = $this->aa;
				$this->ctx->db->begin();
				$community = $this->createCommunity( $field_values, $upload );

				if (!$this->ctx->db->isErrorInTransaction()) {
					$this->ctx->db->end();
				} else {
					$this->ctx->db->rollback();
					return false;
				}

				// --- HACK: set current user role to Moderator --- {{{
				if ($community) {
					$this->ctx->db->begin();
					$info = $aa->getInfo();

					$this->joinCommunity( $community->id, $info['user_id'], 'moderator' );

					if (!$this->ctx->db->isErrorInTransaction()) {
						$this->ctx->db->end();
					} else {
						$this->ctx->db->rollback();
						return false;
					}

					return $this->redirectToCommunity($this->ui_msg['create_community_success'], $community);
				}
				// --- HACK: set current user role to Moderator --- }}}
				# -- form.onCreateSuccess($field_values)

			} else if ($field_values['oid'] == $community_oid) {
				// еще раз можно проверить, тот-ли объект редактируем..
				// на самом деле это избыточная проверка

				$this->params['community_url'] = $field_values['community_url'];
				
				$delete_image = array();
				foreach ( $info as $key=>$val ) {
					if ( preg_match( '/^delete_image(\d+)$/', $key, $matches ) ) {
						$delete_image[] = $matches[1];
					}
				}
				
				// собственно сохранение данных
				if ( $community = $this->changeCommunity($community, $field_values, $upload, $delete_image ) ) {

					return $this->redirectToCommunity($this->ui_msg['edit_community_success']);
				}
			} else {
					return $this->redirectToCommunity($this->ui_msg['access_denied']);
			}
		} else {
			// ошибка валидации формы.. нужно покзать еще раз.
			$aa = &$this->aa;
			$view = $this->rh->views->findByName('preferences');
			$view->data = $aa->template_data;
			$view->data[   '__widgets__'] = $this->widgets;
			$view->data['community_form'] = $content;

			$this->rh->response->setContent( $view );
			return;
		}

		$this->rh->response->setContent( 'Wazzup?!' );
	} // end of function onChangeTdi

	public function validateCommunityUrl ($value, $field)
	{
		$value = mb_strtolower($value);

		$community_oid = $field->form->hash['oid']->model->Model_GetDataValue();
		$ql = 'select objects where
			objects.oid != :1
			and objects.is_deleted = 0
			and community.community_url = :0
			'
			;
		if ($community = $this->ctx->store->find($ql, array($value, $community_oid))->next()) {
			return 'Сообщество с таким URL существует';
		}

		$reserved_worlds = array(
			// $ cat etc/conf.d/url.php | grep -E "'(path|act)'" | awk '{print $3}'|  sort | uniq | sort
			'ajax',
			'allcommunities',
			'chlogin',
			'comments_submit',
			'createcommunity',
			'createitem',
			'createtdi',
			'css',
			'del',
			'deletecomment',
			'deletecommunity',
			'deleteitem',
			'deletetdi',
			'edit',
			'editcomment',
			'edititem',
			'filestorage',
			'identity',
			'images',
			'imagestorage',
			'initdb',
			'join',
			'js',
			'login',
			'logout',
			'members',
			'profile',
			'showalphabet',
			'showfeed',
			'showfiles',
			'showforum',
			'showgallery',
			'showissue',
			'showissues',
			'test',
			'tmp',
			'tpl',
			'undel',
		);
		if (in_array($value, $reserved_worlds)) {
			return "Такой URL уже используется";
		}
	} // end of method validateCommunityUrl

}
